package com.xiguthings.waka.web.swagger;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@EnableSwagger2
@EnableWebMvc
@Configuration
@SuppressWarnings("deprecation")
public class SwaggerConfig extends WebMvcConfigurationSupport {

    private final String version = "1.0";
    private final String author = "贾文斌";
    private final String baseCharacter = "UTF-8";
    //
    // private SpringSwaggerConfig springSwaggerConfig;
    //
    // /**
    // * Required to autowire SpringSwaggerConfig
    // */
    // @Autowired
    // public void setSpringSwaggerConfig(SpringSwaggerConfig
    // springSwaggerConfig)
    // {
    // this.springSwaggerConfig = springSwaggerConfig;
    // }
    //
    // /**
    // * Every SwaggerSpringMvcPlugin bean is picked up by the swagger-mvc
    // * framework - allowing for multiple swagger groups i.e. same code base
    // * multiple swagger resource listings.
    // */
    // @Bean
    // public SwaggerSpringMvcPlugin customImplementation()
    // {
    // return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)
    // .apiInfo(apiInfo())
    // .includePatterns(".*?");
    // }
    //
    // private ApiInfo apiInfo()
    // {
    // ApiInfo apiInfo = new ApiInfo(
    // "My Apps API Title",
    // "My Apps API Description",
    // "My Apps API terms of service",
    // "My Apps API Contact Email",
    // "My Apps API Licence Type",
    // "My Apps API License URL");
    // return apiInfo;
    // }
    //

    // swagger2

    // 综合
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("all-api").select()
                // .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web"))
                // // 注意修改此处的包名
                .paths(PathSelectors.any()).build().apiInfo(apiInfo());
    }

    private ApiInfo apiInfo() {

        return new ApiInfoBuilder().title("waka后台项目所有 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<h1>通用的字段说明<h1>" +
                        "data:返回的数据<br>msg:说明" +
                        "<br>code:返回状态\"0--正确请求\""
                        + "<br>status:状态 0--正常；99--删除；50--发布"
                        + "<br><br><br>编辑富文本内容时：（如果包含图片，请用“#[]”将图片ID包含起来，比如： 文字内容#[FILE_ID]文字内容  ）"
                        + "<br><br>其他的请求的响应参数说明在对应的api接口分组里") // 任意，请稍微规范点
                // .termsOfServiceUrl("http://localhost:8080") //
                // 将“url”换成自己的ip:port
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }

    // growth
    @Bean
    public Docket growthApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("成长维度-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.growth"))
                .paths(PathSelectors.any()).build().apiInfo(growthApiInfo());
    }

    private ApiInfo growthApiInfo() {

        return new ApiInfoBuilder().title("成长维度 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter + "<br>growthId:主键" +
                        "<br>name:名称" +
                        "<br>descr:说明" +
                        "<br>status:状态 0--正常；99--删除；50--发布") // 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }

    // user
    @Bean
    public Docket userApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("用户-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.user"))
                .paths(PathSelectors.any()).build().apiInfo(userApiInfo());
    }

    private ApiInfo userApiInfo() {

        return new ApiInfoBuilder().title("用户 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<br>userId:主键" +
                        "<br>openid:微信唯一标识" +
                        "<br>childNickname:孩子别称" +
                        "<br>cdBeginTime:用户开启下一道题的“冷却的开始时间”" +
                        "<br>status:状态") // 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }

    // sysfile
    @Bean
    public Docket fileApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("文件-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.sysfile"))
                .paths(PathSelectors.any()).build().apiInfo(fileApiInfo());
    }

    private ApiInfo fileApiInfo() {

        return new ApiInfoBuilder().title("文件 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<br>fileId:主键" +
                        "<br>relationId:关联的对象的ID<br>name:文件名" +
                        "<br>filePath:文件路径<br>moduleCode:模块代码" +
                        "<br>fileType:文件类型（后缀名）" +
                        "<br>uploadTime:上传时间" +
                        "<br>uploadUser:上传用户id" +
                        "<br>status:状态") // 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }

    // paper
    @Bean
    public Docket paperApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("试卷-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.paper"))
                .paths(PathSelectors.any()).build().apiInfo(paperApiInfo());
    }

    private ApiInfo paperApiInfo() {

        return new ApiInfoBuilder().title("试卷 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<br>paperId:主键"
                        + "<br>growthId:所属的“成长维度”的主键id"
                        + "<br>paperCardId:提交试卷后获得的卡片的ID"
                        + "<br>descr:试卷的描述"
                        + "<br>rank:试卷的排序号"
                        + "<br>status:状态 0--正常；99--删除；50--发布"
                ) // 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }

    //paperQuestion
    @Bean
    public Docket paperQuestionApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("试题-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.question"))
                .paths(PathSelectors.any()).build().apiInfo(paperQuestionApiInfo());
    }

    private ApiInfo paperQuestionApiInfo() {

        return new ApiInfoBuilder().title("试题 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<br>questionId:主键"
                        + "<br>paperId:所属的“试卷的”的主键id"
                        + "<br>questionContent:试题的内容"
                        + "<br>rank:试题的排序号"
                        + "<br>status:状态 0--正常；99--删除；50--发布"
                ) // 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }

    // questionOption
    @Bean
    public Docket questionOptionApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("答题选项-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.option"))
                .paths(PathSelectors.any()).build().apiInfo(questionOptionApiInfo());
    }

    private ApiInfo questionOptionApiInfo() {

        return new ApiInfoBuilder().title("答题选项 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<br>optionId:主键"
                        + "<br>questionId:所属的“试题的”的主键id"
                        + "<br>content:选项的内容"
                        + "<br>analysis:结果分析"
                        + "<br>score:选择此题所获得的分数"
                        + "<br>rank:试题的排序号"
                        + "<br>status:状态 0--正常；99--删除；50--发布"
                ) // 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }

    //task
    @Bean
    public Docket taskApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("task-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.task"))
                .paths(PathSelectors.any()).build().apiInfo(taskApiInfo());
    }

    private ApiInfo taskApiInfo() {
        return new ApiInfoBuilder().title("task api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<br>taskId:主键"
                        + "<br>paperId:所属的“试卷的”的主键id"
                        + "<br>descr:内容描述"
                        + "<br>status:状态 0--正常；99--删除；50--发布"
                ) // 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }

    // cdCard
    @Bean
    public Docket cdCardApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("冷却加速卡-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.cdcard"))
                .paths(PathSelectors.any()).build().apiInfo(cdCardApiInfo());
    }

    private ApiInfo cdCardApiInfo() {
        return new ApiInfoBuilder().title("冷却加速卡 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<br>coolDownCardId:主键"
                        + "<br>hotValue:加速时间(long)"
                        + "<br>descr:内容描述"
                        + "<br>status:状态 0--正常；99--删除；50--发布"
                ) // 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }

    // paperCard
    @Bean
    public Docket paperCardApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("奖励卡片-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.papercard"))
                .paths(PathSelectors.any()).build().apiInfo(paperCardApiInfo());
    }

    private ApiInfo paperCardApiInfo() {
        return new ApiInfoBuilder().title("奖励卡片 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<br>paperCardId:主键"
                        + "<br>name:卡片名称"
                        + "<br>descr:内容描述"
                        + "<br>status:状态 0--正常；99--删除；50--发布"
                ) // 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }


    // userAnswer
    @Bean
    public Docket userAnswerApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("用户答题记录-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.useranswer"))
                .paths(PathSelectors.any()).build().apiInfo(userAnswerApiInfo());
    }

    private ApiInfo userAnswerApiInfo() {
        return new ApiInfoBuilder().title("用户答题记录 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<br>userAnswerId:主键"
                        + "<br>userId:所属用户的id"
                        + "<br>paperId:答题试卷的id"
                        + "<br>answers:回答问题的答案选项的id，每个答案是用英文逗号分隔"
                        + "<br>submitTime:提交答卷的时间(long)"
                        + "<br>status:状态"
                ) // 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }

    // userCDcard
    @Bean
    public Docket userCDcardApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("用户的加速卡-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.userCDcard"))
                .paths(PathSelectors.any()).build().apiInfo(userCDcardApiInfo());
    }

    private ApiInfo userCDcardApiInfo() {
        return new ApiInfoBuilder().title("用户的加速卡 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<br>userCoolDownCardId:主键"
                        + "<br>coolDownCardId:加速卡的id"
                        + "<br>userId:所属用户的id"
                        + "<br>createTime:获得这加速卡的时间(long)"
                        + "<br>status:状态 0--正常；-1 -- 已使用;99--删除；"
                ) // 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }

    // userShare
    @Bean
    public Docket userShareApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("用户分享-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.userShare"))
                .paths(PathSelectors.any()).build().apiInfo(userShareApiInfo());
    }

    private ApiInfo userShareApiInfo() {
        return new ApiInfoBuilder().title("用户分享 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<br>userShareId:主键"
                        + "<br>shareTarget:分享的目标"
                        + "<br>userId:所属用户的id"
                        + "<br>createTime:分享的时间(long)"
                )// 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }

    // sysConfig
    @Bean
    public Docket sysConfigApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("系统配置-api").select()
                .apis(RequestHandlerSelectors.basePackage("com.xiguthings.waka.web.controller.sysconfig"))
                .paths(PathSelectors.any()).build().apiInfo(sysConfigApiInfo());
    }

    private ApiInfo sysConfigApiInfo() {
        return new ApiInfoBuilder().title("系统配置 api接口列表 " + version) // 任意，请稍微规范点
                .description("字符集" + baseCharacter
                        + "<br>configId:主键"
                        + "<br>code:编码（常量，主要的查询条件)"
                        + "<br>name:名称"
                        + "<br>value:值"
                        + "<br>description:描述"
                )// 任意，请稍微规范点
                .contact(author) // 无所谓（这里是作者的别称）
                .version(version).build();
    }
}
